Banco de Dados

Aula 03 - Modelagem Conceitual II (Refinamentos do ER)




Helder Jefferson Ferreira da Luz

helder.luz@ifpr.edu.br

Objetivos da aula

  • Conhecer outros tipos de relacionamentos entre entidades:
    • Auto-relacionamento: Quando uma entidade se relaciona com ela mesma.
    • Entidades Associativas: Transformando relacionamentos N:M em entidades.

1. Auto-relacionamento (Notação Crow's Foot)

Ocorre quando uma entidade se relaciona com ela mesma. A notação de Crow's Foot mostra isso com uma linha que sai e volta para a mesma entidade.

Exemplo: Funcionários e Supervisores

  • Um FUNCIONÁRIO pode supervisionar outros FUNCIONÁRIOS.
  • Um FUNCIONÁRIO é supervisionado por no máximo um outro FUNCIONÁRIO.

Lê-se: Um funcionário supervisiona zero ou muitos funcionários. Um funcionário é supervisionado por zero ou um funcionário.

2. Resolvendo Relacionamentos N:M

O relacionamento N:M não é implementável diretamente. A solução é criar uma Entidade Associativa (também chamada de tabela de junção).

Processo:

  1. O relacionamento N:M é removido.
  2. Uma nova entidade é criada no meio.
  3. A nova entidade se relaciona com as duas originais com relacionamentos 1:N.
  4. A chave primária da nova entidade é, geralmente, a combinação das chaves primárias das entidades originais.

Entidade Associativa - Exemplo

O relacionamento N:M entre PEDIDO e PRODUTO...

...é resolvido pela entidade ITEM_PEDIDO:

Agora, um pedido tem um ou muitos itens, e um produto pode estar em um ou muitos itens.

Dúvidas? 🤔

Exercícios

  1. Auto-relacionamento: Usando Crow's Foot, modele a entidade CATEGORIA de um e-commerce, onde uma categoria pode ter uma "categoria-pai" (ex: "Smartphones" está dentro de "Eletrônicos").

  2. Entidade Associativa: No modelo da biblioteca (LIVRO, USUARIO), desenhe o diagrama Crow's Foot que resolve o relacionamento N:M "empresta", criando a entidade EMPRESTIMO. Que atributos EMPRESTIMO teria? (Pense em data de empréstimo, data de devolução, etc.)

  3. Entidade Associativa: Considerando um sistema de compras, resolva o relacionamento N:M "faz" da entidade PRODUTO e PEDIDO. A entidade associativa deve conter a quantidade de cada produto, e o preço unitário.

- **Generalização e Especialização**: Modelando hierarquias com "é um(a)".

- **Agregação**: Tratando um relacionamento como uma única entidade.

- **Entidades Fracas**: Entidades que dependem de outras para existir.

```mermaid erDiagram FUNCIONARIO |o--o{ FUNCIONARIO : "supervisiona" ```

```mermaid erDiagram PEDIDO }o--o{ PRODUTO : contém ```

```mermaid erDiagram PEDIDO ||--|{ ITEM_PEDIDO : "contém" PRODUTO ||--|{ ITEM_PEDIDO : "é parte de" ITEM_PEDIDO { int id_pedido FK int id_produto FK int quantidade float preco_unitario } ```

--- # 4. Entidades Fracas Uma entidade fraca depende de uma entidade forte para sua identificação. Em Crow's Foot, isso é representado por um **relacionamento de identificação**, onde a linha do lado da entidade fraca é sólida. **Exemplo**: `ITEM_PEDIDO` e `PEDIDO`. - Um `ITEM_PEDIDO` não existe sem um `PEDIDO`. - A chave de `ITEM_PEDIDO` depende da chave de `PEDIDO`. ```mermaid erDiagram PEDIDO ||--|{ ITEM_PEDIDO : "possui" PEDIDO { int id PK datetime data } ITEM_PEDIDO { int id_pedido FK int numero_item string id_produto FK } ``` *O relacionamento `possui` é de identificação, pois `ITEM_PEDIDO` não pode existir sem `PEDIDO`.*

3. **Generalização/Especialização**: Desenhe o diagrama Crow's Foot para a situação: - Uma `CONTA_BANCARIA` pode ser `CONTA_CORRENTE` ou `CONTA_POUPANCA`. - Toda conta tem `numero`, `agencia` e `saldo`. - `CONTA_CORRENTE` tem `limite_cheque_especial`. - `CONTA_POUPANCA` tem `taxa_rendimento`. 4. **Entidade Fraca**: Por que `ITEM_PEDIDO` é um bom exemplo de entidade fraca em relação a `PEDIDO`? Desenhe o diagrama Crow's Foot apenas para essas duas entidades, destacando o relacionamento de identificação.

--- # 3. Generalização e Especialização (Herança) A notação de Crow's Foot representa herança com uma linha que se ramifica da superclasse para as subclasses. **Exemplo**: `PESSOA` é a superclasse de `CLIENTE` e `FUNCIONÁRIO`. ```mermaid erDiagram PESSOA { int id PK string nome string cpf } CLIENTE { int id_pessoa FK float limite_credito } FUNCIONARIO { int id_pessoa FK float salario } PESSOA ||--o| CLIENTE : "é um" PESSOA ||--o| FUNCIONARIO : "é um" ``` *Tanto `CLIENTE` quanto `FUNCIONARIO` herdam os atributos de `PESSOA`.*